/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.medical.controlador;

import com.ec.medical.enumeracion.RolesEnum;
import com.ec.medical.interfaces.Imprimible;
import com.ec.medical.managers.SesionDataManager;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;

/**
 *
 * @author Administrador
 */
public abstract class ControladorBase {

   private Logger LOG = Logger.getLogger(ControladorBase.class.getName());

    @ManagedProperty(value = "#{sesionDataManager}")
    protected SesionDataManager sesionDataManager;
    private List<String> listaManagerReservados;
    
    {
        listaManagerReservados = new ArrayList<String>();
        listaManagerReservados.add("sesionDataManager");
    }

    /**
     * genera los items para ser mostrador como una lista en pantalla
     *
     * @param lista
     * @return
     */
    protected List<SelectItem> generarItems(List<? extends Imprimible> lista) {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (Imprimible imprimible : lista) {
            items.add(new SelectItem(imprimible.getObjecto(), imprimible.getEtiqueta()));
        }
        return items;
    }

    /**
     * genera los items para ser mostrados con el primer elemento
     * "Seleccione..."
     *
     * @param lista
     * @return
     */
    protected List<SelectItem> generarItemsConValorNulo(List<? extends Imprimible> lista) {
        List<SelectItem> items = new ArrayList<SelectItem>();
        items.add(new SelectItem(null, "Seleccione..."));
        items.addAll(generarItems(lista));
        return items;
    }

    /**
     * Recupera la fecha actual con 0 horas 0 min y 0 seg
     *
     * @return
     */
    protected Date obtenerFechaActual() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR, 0);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }

    /**
     * Recupera la fecha actual con horas mnutos y segundos
     *
     * @return
     */
    protected Date obtenerFechaActualConHora() {
        Calendar calendar = Calendar.getInstance();
        return calendar.getTime();
    }

    /**
     * muestra mensaje informativo en pantalla
     *
     * @param message
     */
    protected void infoMessage(String message) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, message, ""));
    }

    /**
     * * muestra mensaje de error en pantalla
     *
     * @param message
     */
    protected void errorMessage(String message) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, ""));
    }

    /**
     * * muestra mensaje de advertencia en pantalla
     *
     * @param message
     */
    protected void warningMessage(String message) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, message, ""));
    }

    public SesionDataManager getSesionDataManager() {
        return sesionDataManager;
    }

    public void setSesionDataManager(SesionDataManager sesionDataManager) {
        this.sesionDataManager = sesionDataManager;
    }

    protected abstract void imprimirLogInfo(String mensaje);

    protected abstract void imprimirLogError(String mensaje);
    
     public abstract void iniciarDatos();   

    /**
     * metodo que elimina los datamanager de menoria
     */
    protected void limpiarDataManager() {

        CharSequence cs = ".";
        FacesContext fc = FacesContext.getCurrentInstance();
        Iterator<String> it = fc.getExternalContext().getSessionMap().keySet().iterator();
        while (it.hasNext()) {
            String key = it.next();
            if (!key.contains(cs) && !listaManagerReservados.contains(key)) {
                LOG.info("Elimina de session: key " + key);
                fc.getExternalContext().getSessionMap().remove(key);
            }
        }
    }
    
    /**
     * retorna el username del usuario logueado
     * @return
     */
    public String  usuarioLogueado(){
        return FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
    }
    
    /**
     *
     * @param role
     * @return
     */
    public boolean isUserInRol(RolesEnum role){
        return FacesContext.getCurrentInstance().getExternalContext().isUserInRole(role.name());
    }
}
